package com.zhongge;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Arrays;//到时候测试编写之时用得到
import java.util.Scanner;

@SuppressWarnings("all")
/**
 * @ClassName Test01
 * @Description 使用共享数据的主程序/子程序
 * @Author 李明忠
 * @Date 2025/4/29 08:21
 * @Version 1.0
 */
public class Test01 {
    //定义一个数组用于存放处理前(从文件中读来的数据)
    //所有的数据源将存在这里供其他方法共享
    public static StringBuffer[] initStr;

    //定义一个循环移动后和排序后的文本存放处
    public static StringBuffer[] moveStr;

    //2.处理文件
    public static void processFile(){
        //1.输入文件路径 text/test.txt
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入文件路径");
        String filePath = sc.nextLine();

        //使用try()-catch语句的好处是文讲可以自己关闭
        try (
                //2.1创建文件字符输入流对象
                FileReader fr = new FileReader(filePath);
                FileReader fr2 = new FileReader(filePath);
                //2.2创建文件缓冲字符输入流对象(为了提高读取效率)
                //未得到行数赋能
                BufferedReader br = new BufferedReader(fr);
                //用于读数据
                BufferedReader br2 = new BufferedReader(fr2);
        ) {
            //2.3业务逻辑

            //接收每一行
            String line;
            //记录文件的行数
            int count = 0;
            //开始计算有多少行
            while ((line = br.readLine()) != null){
                //将读取到的数据
                count++;
            }
            //创建String对象用于存读取到的文本
            initStr = new StringBuffer[count];

            //count置为0用于遍历赋能
            count = 0;

            //开始读取
            while ((line = br2.readLine()) != null){
                //读到的每一行字符串存入字符数组
                //使用一个临时变量为initStr[temp].append(line);赋能
                //防止initStr[count].append(line);count是增加后的值出异常
                int temp = count;
                //首先为字符串数组中的各个元素实例化对象
                initStr[count++] = new StringBuffer();
                //有对象之后再碗里面插入数据
                initStr[temp].append(line);
            }
            System.out.println("============读入的数据==========");
            for (int i = 0; i < initStr.length; i++) {
                System.out.println(initStr[i]);
            }
            System.out.println("===============end=============\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //3.进行循环移动
    public static void cycMove(){
        //存放文件中的字符串（用作过渡阶段）
        String[][] strings = new String[initStr.length][];
        /**
         * 注意StringBuffer需要转为字符串才可以使用split()函数
         */
        for (int i = 0; i < initStr.length; i++) {
            //列的个数(注意这个是二维数组的知识)==>多练多总结
            strings[i] = initStr[i].toString().split(" ");
        }
        System.out.println("==========切割成字符串数组=========");
        System.out.println(Arrays.deepToString(strings));
        System.out.println("===============end=============\n");

        //存放移动后的行数
        int moveCount = 0;

        for (int i = 0; i < strings.length; i++) {
            moveCount += strings[i].length;
        }
        System.out.println("=========循环移动后的行数===========");
        System.out.println(moveCount + "行");//14行
        System.out.println("===============end=============\n");

        //初始化存放后移后的文本
        moveStr = new StringBuffer[moveCount];
        //初始化所有元素
        for (int i = 0; i < moveStr.length; i++) {
            moveStr[i] = new StringBuffer();
        }
        //使用中间变量来控制moveStr的下标
        int temp = 0;
        //最外层控制行数
        for (int i = 0; i < strings.length; i++) {
            //移动一行的算法
            for (int j = 0; j < strings[i].length; j++) {

                //以下两个for循环将实现后移的效果
                for (int k = j; k < strings[i].length; k++) {
                    moveStr[temp].append(strings[i][k]).append(" ");
                }

                for (int k = 0; k < j; k++) {
                    moveStr[temp].append(strings[i][k]).append(" ");
                }
                //追加完一行后temp++
                temp++;
            }
        }
        System.out.println("=========循环移动后的结果===========");
        for (int i = 0; i < moveStr.length; i++) {
            System.out.println(moveStr[i]);
        }
        System.out.println("===============end=============\n");
    }

    //4.进行排序
    public static void lineSort(){
        /**
         * 直接使用compareTo()
         * compareTo()方法以字典的字母顺序比较
         * StringBuffer只有先转为String才可以调用compareTo方法
         */
        //冒泡排序
        for (int i = 0; i < moveStr.length - 1; i++) {
            for (int j = 0; j < moveStr.length - i -1; j++) {

                //将moveStr[j]和moveStr[j+1]先转为String来判别但是他们本身没有变成字符串
                //调用方toString()方法时候他是重新创建了新空间。
                if(moveStr[j].toString().compareTo(moveStr[j + 1].toString()) > 0){
                    StringBuffer temp;
                    temp = moveStr[j];
                    moveStr[j] = moveStr[j+1];
                    moveStr[j+1] = temp;
                }
            }
        }
        System.out.println("===========排序后的结果===========");
        for (int i = 0; i < moveStr.length; i++) {
            System.out.println(moveStr[i]);
        }
        System.out.println("===============end=============\n");
    }

    //5.输出结果
    public static void output(){
        System.out.println("===========排序后的结果===========");
        for (int i = 0; i < moveStr.length; i++) {
            System.out.println(moveStr[i]);
        }
        System.out.println("===============end=============\n");
    }

    public static void main(String[] args) {

        //2.处理文件
        processFile();
        //3.进行循环移动
        cycMove();
        //4.进行排序
        lineSort();
        //5.输出结果
        //output();
    }
}
